package top.saodisheng.util;

import lombok.Data;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * Description:
 * 分页工具类
 * JPA默认提供了分页：org.spring.framework.data.domin.Page。
 * 这个分页类已经基本上能满足各项分类需要了。
 * 但如果我们需要实现的分页效果是：显示当前页前后几页的下标供选择时，这个时候就需要自己手动
 * 封装Page类。
 *
 * @author 扫地生_saodisheng
 */
@Data
public class Page4Navigator <T>{
    Page<T> pageFromJPA;
    int navigatePages;      // 导航栏中出现的页面下标
    int totalPages;         // 总页数
    int number;             // 当前页码
    long totalElements;     // 总页码
    int size;               // 每页显示的记录个数
    int numberOfElements;   // 记录的总数
    List<T> content;        // 从数据库中获取的记录内容
    boolean isHasContent;   // 判断是否有记录
    boolean first;          // 是否是首页
    boolean last;           // 是否是最后一页
    boolean isHasNext;      // 是否还有下一页
    boolean isHasPrevious;  // 是否还有前一页
    int[] navigatepageNums;

    public Page4Navigator() {}

    public Page4Navigator(Page<T> pageFromJPA, int navigatePages) {
        this.pageFromJPA = pageFromJPA;
        this.navigatePages = navigatePages;

        totalPages = pageFromJPA.getTotalPages();
        number = pageFromJPA.getNumber();
        totalElements = pageFromJPA.getTotalElements();
        size = pageFromJPA.getSize();
        numberOfElements = pageFromJPA.getNumberOfElements();
        content = pageFromJPA.getContent();
        isHasContent = pageFromJPA.hasContent();
        first = pageFromJPA.isFirst();
        last = pageFromJPA.isLast();
        isHasNext = pageFromJPA.hasNext();
        isHasPrevious = pageFromJPA.hasPrevious();
        calcNabigatepageNums();
    }

    // 用来计算数值，并返回一个int数组变量navigatepageNums，方便前端遍历展示
    private void calcNabigatepageNums() {
        int[] navigatepageNums;
        int totalPages = getTotalPages();
        int num = getNumber();

        // 当总页数小于或等于导航页数时
        if (totalPages <= navigatePages) {
            navigatepageNums = new int[totalPages];
            for (int i = 0; i < totalPages; i++) {
                navigatepageNums[i] = i + 1;
            }
        } else {
            navigatepageNums = new int[navigatePages];
            int startNum = num - navigatePages / 2;     // 起始页为当前的显示页减去导航页的一半
            int endNum = num + navigatePages / 2;

            if (startNum < 1) {
                startNum = 1;
                // 最前的导航页
                for (int i = 0; i < navigatePages; i++) {
                    navigatepageNums[i] = startNum++;
                }
            } else if (endNum > totalPages) {
                endNum = totalPages;
                // 最后的导航页
                for (int i = navigatePages - 1; i >= 0; i--) {
                    navigatepageNums[i] = endNum--;
                }
            } else {
                // 所有中间页
                for (int i = 0; i < navigatePages; i++) {
                    navigatepageNums[i] = startNum++;
                }
            }
        }
        this.navigatepageNums = navigatepageNums;
    }
}
